home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 12 / CU Amiga Magazine's Super CD-ROM 12 (1997)(EMAP Images)(GB)[!][issue 1997-07].iso / CUCD / Games / DestructivePoker / sources / sources.lha / gfxload.cpp < prev    next >
C/C++ Source or Header  |  1997-02-18  |  4KB  |  163 lines

  1. /*
  2.         GfxLoad.cpp
  3.  
  4.         V1.00 - 021196  Kimmo teräväinen
  5.         -----   ------  ----------------
  6.         V0.10   181196  Stolen loader of ffeditor.
  7.  
  8. */
  9.  
  10. #include <inline++/exec.h>
  11. #include <inline++/graphics.h>
  12. #include <inline++/iffparse.h>
  13. #include <inline++/dos.h>
  14. #include <exec/memory.h>
  15. #include <graphics/gfx.h>
  16. #include <libraries/iffparse.h>
  17.  
  18.  
  19.  
  20. // ILBM BitMap-Handle BMHD
  21. //
  22. struct  BMHD_Chunk {
  23.   WORD  Width,Height;
  24.   LONG  Reserved1;
  25.   UBYTE Depth,Reserved2,Compression,Reserved3;
  26.   WORD  Transparency;
  27.   UBYTE pixelratiox,pixelratioy;
  28.   WORD  ScreenWidth,ScreenHeight;
  29. };
  30.  
  31.  
  32.  
  33. #define  ID_ILBM        MAKE_ID('I','L','B','M')
  34. #define  ID_BMHD        MAKE_ID('B','M','H','D')
  35. #define  ID_CMAP        MAKE_ID('C','M','A','P')
  36. #define  ID_BODY        MAKE_ID('B','O','D','Y')
  37.  
  38.  
  39. // Will free allocated BitMap
  40. //
  41. void FreeBlocks(BitMap &bmap)
  42. {
  43.   int i,depth=bmap.Depth;
  44.   long width =bmap.BytesPerRow*8,
  45.        height=bmap.Rows;
  46.  
  47.   for( i = 0; i < 8; i++ )
  48.     if( bmap.Planes[ i ] )
  49.       FreeRaster( bmap.Planes[i], width, height );
  50.  
  51. }
  52.  
  53.  
  54. // DeCompress ILBM-BODY to BitPlanes (bmap)
  55. //
  56. void DeCompressILBMBody(BitMap &bmap,BMHD_Chunk &BMHD,BYTE *BodyBuffer)
  57. {
  58.   BYTE *source=BodyBuffer;
  59.   BYTE *dest,x;
  60.   WORD y,height=bmap.Rows,BytesPerRow=bmap.BytesPerRow;
  61.   UBYTE d,depth=bmap.Depth;
  62.   UBYTE compression=BMHD.Compression;
  63.  
  64.   for(y=0; y<height; y++)
  65.     for(d=0; d<depth; d++) {
  66.       dest=(BYTE *)(bmap.Planes[d]+BytesPerRow*y);
  67.       switch(compression) {
  68.         case 0: for( x=0; x<BytesPerRow; x++) *dest++=*source++; break;
  69.         case 1: x=0;
  70.                 while(x<BytesPerRow) {
  71.                   BYTE c=*source++;
  72.                   if(c>=0) {
  73.                     x+=c+1; for( ; c>=0 ; c--) *dest++=*source++;
  74.                   } else {
  75.                     BYTE data=*source++;
  76.                     x-=c-1;
  77.                     for(; c<=0 ; c++) *dest++=data;
  78.                   }
  79.                 }
  80.                 break;
  81.       }
  82.     }
  83.  
  84. }
  85.  
  86.  
  87. // Main Gfx-load routine
  88. //
  89. // if success BitMap (bmap) is filled with Block-graphics
  90. // if failed RT<>0
  91. //
  92. // WARNING: 1: Given BitMap MUST be filled with NULLs when calling this
  93. //          2: FreeBlocks MUST called always after this on exit
  94. //
  95. long LoadBlocks(BitMap &bmap,UBYTE *colortable,UBYTE *BlocksFileName)
  96. {
  97.   ContextNode *cn;
  98.   IFFHandle *iff;
  99.   int i,depth,BMHD_Done=FALSE;
  100.   long width,height,rlen,error=10;
  101.   BMHD_Chunk My_BMHD;
  102.   BYTE *BodyBuf=NULL;
  103.   ULONG BodyBufSize=0;
  104.  
  105.   if ((iff = AllocIFF())) {
  106.     if ((iff->iff_Stream = Open(BlocksFileName, MODE_OLDFILE))) {
  107.       InitIFFasDOS(iff);
  108.       if (!(error = OpenIFF(iff, IFFF_READ))) {
  109.         while (1) {
  110.           error = ParseIFF(iff, IFFPARSE_RAWSTEP);
  111.           if (error == IFFERR_EOC) continue;
  112.           else if (error) break;
  113.  
  114.           cn = CurrentChunk(iff);
  115.  
  116.           if((cn)&&(cn->cn_Type == ID_ILBM)) {
  117.             switch(cn->cn_ID) {
  118.               case ID_BMHD:
  119.                    rlen = ReadChunkBytes(iff,&My_BMHD,cn->cn_Size);
  120.                    if(rlen < 0) { error = rlen; break; }
  121.                    depth =My_BMHD.Depth;
  122.                    width =My_BMHD.Width;
  123.                    height=My_BMHD.Height;
  124.  
  125.                    InitBitMap( &bmap, depth, width, height );
  126.  
  127.                    for( i = 0; i < depth; i++ ) {
  128.                      if(!(bmap.Planes[i] = (PLANEPTR) AllocRaster( width, height ))) {
  129.                        error = 10; break; }
  130.                    }
  131.                    BMHD_Done=TRUE;
  132.                    break;
  133.  
  134.               case ID_CMAP:
  135.                    rlen = ReadChunkBytes(iff,colortable,cn->cn_Size);
  136.                    if(rlen < 0) error = rlen;
  137.                    break;
  138.  
  139.               case ID_BODY:
  140.                    if(!BMHD_Done) { error=10; break; }
  141.                    BodyBufSize=cn->cn_Size;
  142.                    if(!(BodyBuf=(BYTE *)AllocMem(BodyBufSize,MEMF_ANY))) break;
  143.                    rlen = ReadChunkBytes(iff,BodyBuf,BodyBufSize);
  144.                    if(rlen < 0) error = rlen;
  145.                    DeCompressILBMBody(bmap,My_BMHD,BodyBuf);
  146.                    break;
  147.             }
  148.             if(error) break;
  149.  
  150.           }
  151.         }
  152.         CloseIFF(iff);
  153.       }
  154.       Close(iff->iff_Stream);
  155.     }
  156.     FreeIFF(iff);
  157.   }
  158.   if(error == IFFERR_EOF) error=0;
  159.   if(!BMHD_Done) error+=1000;
  160.   if(BodyBuf) { FreeMem(BodyBuf,BodyBufSize); } else error+=100;
  161.   return error;
  162. }
  163.